# Написать программу, которая рисует на RARS Bitmap Display множество точек, расстояние от которых до данной с координатами X, Y не превышает заданного R, т. е. круг.
# Программа вводит пять неотрицательных целых чисел: X, Y, R, цвет точек в круге и цвет точек вне круга.
#    Не гарантируется, что круг целиком помещается в видеопамяти или вообще находится в ней
#    Параметры Bitmap Display: 2×2; 512×256

.include "macros.inc"

.eqv    BASE 0x10010000			# MMIO экрана
.eqv    WIDTH 256
.eqv    HEIGHT 128
.eqv    ALLSIZE 0x8000                	# размер экрана в ячейках
	
.data	0x10000000
X:	.word	0
Y:	.word	0
R:	.word	0
c_circ: .word	0
c_bgr:	.word	0


.text
.globl  main
main:
	la	t0 X			# Заполним X
	syscall	5
	bgez	a0 point_X
	neg	a0 a0
point_X:
	sw	a0 (t0)
	
	la	t0 Y			# Заполним Y
	syscall	5
	bgez	a0 point_Y
	neg	a0 a0
point_Y:
	sw	a0 (t0)
	
	la	t0 R			# Заполним R
	syscall	5
	bgez	a0 radius
	neg	a0 a0
radius:
	sw	a0 (t0)
	
	la	t0 c_circ		# Заполним c_circ
	syscall	5
	bgez	a0 color_circ
	neg	a0 a0
color_circ:
	sw	a0 (t0)
	
	la	t0 c_bgr		# Заполним c_bgr
	syscall	5
	bgez	a0 color_bgr
	neg	a0 a0
color_bgr:
	sw	a0 (t0)
	
	li	t4 BASE			# Выведем круг
	li	t5 ALLSIZE
	slli	t5 t5 2
	add	t5 t4 t5
	li	t6 BASE
	la	s1 X			# Получим координаты центра и радиус круга
	lw	s1 (s1)
	la	s2 Y
	lw	s2 (s2)
	la	s3 R
	lw	s3 (s3)
	mul	s3 s3 s3		# Квадрат радиуса
displayloop:
	bge	t4 t5 enddisplayloop	# Проверим на конец видеопамяти
	sub	t2 t4 t6		# Найдем номер точки в строке
	srli	t2 t2 2
	li	t3 WIDTH
	rem	t0 t2 t3		# Координата X текущей точки
	div	t1 t2 t3		# Координата Y текущей точки
	sub	t0 s1 t0		# Проверим условие на вхождение в круг (X-X0)^2+(Y-Y0)^2<=R^2
	mul	t0 t0 t0
	sub	t1 s2 t1
	mul	t1 t1 t1
	add	t0 t0 t1
	bgt	t0 s3 nocircl
	la	t2 c_circ
	b	next	
nocircl:
	la	t2 c_bgr
next:	lw	t3 (t2)
	sw	t3 (t4)			# Загружаем в видеопамять
	addi	t4 t4 4
	b	displayloop	
enddisplayloop:        

        syscall 10
